package com.solution.admin.auth.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.solution.admin.auth.dao.RoleDao;
import com.solution.admin.auth.entity.RoleEntity;
import com.solution.admin.auth.service.RoleService;
import com.solution.common.dao.BaseDao;
import com.solution.common.exception.BizException;
import com.solution.common.page.PageBean;
import com.solution.common.page.PageParam;
import com.solution.common.service.impl.BaseServiceImpl;
import com.solution.common.utils.string.StringUtil;

/**
 * 角色管理业务层
 * @author james
 */
@Service
public class RoleServiceImpl extends BaseServiceImpl<RoleEntity> implements RoleService {
	private static final Logger logger = LoggerFactory.getLogger(RoleServiceImpl.class);
	@Autowired
	private RoleDao roleDao;
	
	@Override
	protected BaseDao<RoleEntity> getDao() {
		return roleDao;
	}

	/**
	 * 查询用户登录某系统的角色列表
	 * 
	 * @param param
	 * @return
	 * @author llp
	 * @date 2017年4月18日 上午11:54:38
	 */
	@Override
	public List<RoleEntity> listRole(Map<String, Object> param) {
		return roleDao.listRole(param);
	}
	
	/**
	 * 保存角色
	 * @author james
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED , rollbackFor = Exception.class)
	public long saveRole(RoleEntity roleEntity, String resourceIds) {
		long roleId = 0;
		try {
			roleId = roleDao.saveRole(roleEntity);
			// 保存资源授权
			if(StringUtil.isNotEmpty(resourceIds)){
				String[] resouceIdsArr = resourceIds.split(",");
				for (String resId : resouceIdsArr) {
					Map<String, Object> param = new HashMap<String, Object>();
					param.put("roleID", roleId);
					param.put("resourceId", resId);
					roleDao.insertRoleResource(param);
				}
			}
		} catch (Exception e) {
			throw new BizException("保存角色异常", e);
		}
		return roleId;
	}
	

	/**
	 * 更新角色授权
	 * @param role
	 * @param resourceIds
	 * @return
	 */
	@Override
	public int updateRole(RoleEntity role, String resourceIds) {
		int result = roleDao.updateRole(role);
		// 删除用户授权
		roleDao.deleteRoleResourceByRoleId(role.getId());
		// 保存用户授权
		if (StringUtil.isNotEmpty(resourceIds)) {
			String[] resouceIdsArr = resourceIds.split(",");
			for (String resId : resouceIdsArr) {
				Map<String, Object> param = new HashMap<String, Object>();
				param.put("roleID", role.getId());
				param.put("resourceId", resId);
				roleDao.insertRoleResource(param);
			}
		}
		return result;
	}

	/**
	 * 修改角色状态
	 * @param roleEntity
	 * @param roleResourceMap
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月9日 下午12:59:49
	 */
	@Override
	public int updateRoleStatus(RoleEntity roleEntity) {
		return roleDao.updateRoleStatus(roleEntity);
	}

	/**
	 * @param pageBean
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月9日 下午1:06:54
	 */
	@Override
	public PageBean getRoleList(PageParam pageParam, Map<String, Object> paramMap) {
		return roleDao.getRolePage(pageParam, paramMap);
	}

	/**
	 * @param id
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月9日 下午1:06:54
	 */
	@Override
	public RoleEntity getRoleById(Long id) {
		// 查询角色
		RoleEntity roleEntity = roleDao.getById(id);
		return roleEntity;
	}

	/**
	 * @param id
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月9日 下午1:06:54
	 */
	@Override
	@Transactional
	public int deleteRole(Long id) {
		int count = roleDao.deleteById(id);
		count += roleDao.deleteRoleResourceById(id);
		return count;
	}

	/**
	 * @param roleName
	 * @param roleCode
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月13日 上午11:18:48
	 */
	@Override
	public Long getRoleByNameOrCode(String roleName, String roleCode) {
		// TODO Auto-generated method stub
		Long count = 0L;
		// 判断角色编号是否存在
		if (roleCode != null) {
			count = roleDao.getRoleByCode(roleCode);
			if (count > 0) {
				return 1L;
			}
		}
		// 判断角色名是否存在
		if (roleName != null) {
			count = roleDao.getRoleByName(roleName);
			if (count > 0) {
				return 2L;
			}
		}

		return 0L;
	}

	/**
	 * 查询所有角色信息
	 * 
	 * @param userId
	 *            用户ID
	 * @return
	 * @author llp
	 * @date 2017年4月14日 上午8:55:29
	 */
	@Override
	public List<RoleEntity> listAllRoleList() {
		return roleDao.listAllRoleList();
	}

	/**
	 * 查询用户的角色信息
	 * 
	 * @param userId
	 *            用户ID
	 * @return
	 * @author llp
	 * @date 2017年4月14日 上午8:55:29
	 */
	@Override
	public List<RoleEntity> listUserRole(Long userId) {
		return roleDao.listRoleListByUserId(userId);
	}

	/**
	 * 查询用户可分配及已分配的角色列表
	 * 
	 * @param dealerId
	 *            经销商ID
	 * @param userId
	 *            用户ID
	 * @return 角色列表
	 */
	@Override
	public List<RoleEntity> listRoleWithChkflagForUser( Long userId) {
		return roleDao.listRoleWithChkflagForUser( userId);
	}
	
	/**
	 * 更新角色名称
	 * @param roleId 角色编号
	 * @param roleName 角色名称
	 * @return 更数的行数
	 */
	@Override
	public int updateRoleName(Long roleId,String roleName,String roleIntro){
		return roleDao.updateRoleName(roleId, roleName,roleIntro);
	}
	/**
	 * 查询用户是否是某角色
	 * @param userId 用户ID
	 * @param roleId 角色ID
	 * @return true 有  false 无  
	 * @author xu_cc  
	 * @throws Exception exception
	 * @Date 创建时间：2018年2月5日 下午3:27:29
	 */
	public boolean checkUserRoleChkFlg(Long userId, Long roleId) {
		return roleDao.checkUserRoleChkFlg(userId, roleId);
	}
	
	/**
	 * 逻辑删除角色
	 * @param parseLong
	 * @return
	 */
	public int logicDeleteRole(long roleId){
		return roleDao.logicDeleteRole(roleId);
	}
}
